/**
 * Created by quliang on 16-4-7 下午2:07.
 * Copyright (c) 2016 SAIZ.CN. All rights reserved.
 */

package com.example.db.utils;

import android.util.Log;

import com.example.db.common.SaizConstant;

import java.sql.Time;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;


public final class DateUtil {
    private final static String TAG = "dateUtil";

    private DateUtil() {
    }

    /**
     * 获得日历
     *
     * @return calendar
     */
    public static Calendar getCalendar() {
        return GregorianCalendar.getInstance(SaizConstant.DEF_TIMEZONE);
    }

    public static Calendar getCalendar(int year, int month, int day) {
        Calendar cal = getCalendar();
        cal.set(year, month, day);
        return cal;
    }

    /**
     * 获得指定时间的日历
     *
     * @return calendar
     */
    public static Calendar getCalendar(Date date) {
        Calendar cal = GregorianCalendar.getInstance(SaizConstant.DEF_TIMEZONE);
        cal.setTime(date);
        return cal;
    }

    /**
     * 比较两个 Date 对象表示的时间值
     *
     * @param date1 第一个
     * @param date2 第二个
     * @return 如果date1 的时间与date2 的时间等于，则返回 0 值；
     * 如果date1 的时间在date2 的时间之前，则返回小于 0 的值；
     * 如果date1 的时间在date2 的时间之后，则返回大于 0 的值。
     */
    public static int compare(Date date1, Date date2) {
        return getCalendar(date1).compareTo(getCalendar(date2));
    }

    /**
     * 给定的日历字段添加或减去指定的时间量。
     *
     * @param date   date
     * @param field  日历字段。
     * @param amount 增量用正数，否则用负数
     * @return date
     */
    public static Date add(Date date, int field, int amount) {
        Calendar calendar = getCalendar();
        calendar.setTime(date);
        calendar.add(field, amount);
        return calendar.getTime();
    }

    /**
     * 获得日历字段指定的时间量
     *
     * @param date  date
     * @param field 日历字段。
     * @return 时间量
     */
    public static Integer get(Date date, int field) {
        Calendar calendar = getCalendar();
        calendar.setTime(date);
        return calendar.get(field);
    }


    public static String getTime(long time){
        Date date = new Date(time);
        SimpleDateFormat format = new SimpleDateFormat(SaizConstant.TIME);
        return format.format(date);
    }
    /**
     * 获得当前时间
     *
     * @return date
     */
    public static Date getToday() {
        return new Date(System.currentTimeMillis());
    }

    /**
     * 获得时间格式化实例
     *
     * @param format 格式
     * @return 实例
     */
    public static DateFormat getFormat(String format) {
        DateFormat df = new SimpleDateFormat(format, SaizConstant.DEF_LOCALE);
        df.setTimeZone(SaizConstant.DEF_TIMEZONE);
        return df;
    }

    public static String format(int year, int month, int day) {
        Calendar cal = getCalendar();
        cal.set(year, month, day);
        return format(cal.getTime(), SaizConstant.DEF_DATE_FORMAT);
    }

    /**
     * 格式化时间对象
     *
     * @param seconds 秒数
     * @return 格式化后的字符串
     */
    public static String formatDay(long seconds) {
        return format(seconds, SaizConstant.DEF_DATE_FORMAT);
    }

    /**
     * 格式化时间对象
     *
     * @param seconds 秒数
     * @return 格式化后的字符串
     */
    public static String format(long seconds) {
        return format(seconds, SaizConstant.DEF_DATETIME_FORMAT);
    }


    /**
     * 格式化时间对象
     *
     * @param seconds 毫秒数
     * @param format  格式
     * @return 格式化后的字符串
     */
    public static String format(long seconds, String format) {
        return getFormat(format).format(new Date(seconds * 1000l));
    }

    /**
     * 格式化时间对象
     *
     * @param date date
     * @return 格式化后的字符串
     */
    public static String format(Date date) {
        return format(date, SaizConstant.DEF_DATETIME_FORMAT);
    }


    /**
     * 格式化时间对象
     *
     * @param date   date
     * @param format 格式
     * @return 格式化后的字符串
     */
    public static String format(Date date, String format) {
        return getFormat(format).format(date);
    }

    /**
     * 将source时间字符串转换成Date类型
     *
     * @param source 表示时间的字符串
     * @return 转换后的Date类型
     */
    public static Date toDate(String source) throws ParseException {
        return toDate(source, SaizConstant.DEF_DATETIME_FORMAT);
    }

    /**
     * 将source时间字符串转换成Date类型
     *
     * @param source 表示时间的字符串
     * @param format 格式化字符串表示
     * @return 转换后的Date类型
     */
    public static Date toDate(String source, String format) throws ParseException {
        try {
            return getFormat(format).parse(source);
        } catch (ParseException e) {
            Log.w(TAG, "", e);
            throw e;
        }
    }

    /**
     * 将source时间字符串转换成Timestamp类型
     *
     * @param source 表示时间的字符串
     * @return 转换后的Timestamp类型
     */
    public static Timestamp toTimestamp(String source) throws ParseException {
        return toTimestamp(source, SaizConstant.DEF_DATETIME_FORMAT);
    }

    /**
     * 将source时间字符串转换成Timestamp类型
     *
     * @param source 表示时间的字符串
     * @param format 格式化字符串表示
     * @return 转换后的Timestamp类型
     */
    public static Timestamp toTimestamp(String source, String format) throws ParseException {
        return new Timestamp(toDate(source, format).getTime());
    }

    /**
     * 将source时间字符串转换成Time类型
     *
     * @param source 表示时间的字符串
     * @return 转换后的Time类型
     */
    public static Time toTime(String source) throws ParseException {
        return toTime(source, SaizConstant.DEF_DATETIME_FORMAT);
    }

    /**
     * 将source时间字符串转换成Time类型
     *
     * @param source 表示时间的字符串
     * @param format 格式化字符串表示
     * @return 转换后的Time类型
     */
    public static Time toTime(String source, String format) throws ParseException {
        return new Time(toDate(source, format).getTime());
    }

    /**
     * 获得年
     *
     * @param date Date对象
     * @return 该Date对象表示年份
     */
    public static Integer getYear(Date date) {
        return get(date, Calendar.YEAR);
    }

    /**
     * 获得月
     *
     * @param date Date对象
     * @return 该Date对象表示月份
     */
    public static Integer getMonth(Date date) {
        return get(date, Calendar.MONTH);
    }

    /**
     * 获得日
     *
     * @param date Date对象
     * @return 该Date对象表示日
     */
    public static Integer getDay(Date date) {
        return get(date, Calendar.DATE);
    }

    /**
     * 获得时
     *
     * @param date Date对象
     * @return 该Date对象表示小时
     */
    public static Integer getHour(Date date) {
        return get(date, Calendar.HOUR);
    }

    /**
     * 获得分钟
     *
     * @param date Date对象
     * @return 该Date对象表示分钟
     */
    public static Integer getMinute(Date date) {
        return get(date, Calendar.MINUTE);
    }

    /**
     * 获得秒数
     *
     * @param date Date对象
     * @return 该Date对象表示秒数
     */
    public static Integer getSecond(Date date) {
        return get(date, Calendar.SECOND);
    }

    /**
     * 添加或减去年数
     *
     * @param date   Date对象
     * @param amount 增量用正数，否则用负数
     * @return date
     */
    public static Date addYear(Date date, int amount) {
        return add(date, Calendar.YEAR, amount);
    }

    /**
     * 添加或减去月数
     *
     * @param date   Date对象
     * @param amount 增量用正数，否则用负数
     * @return date
     */
    public static Date addMonth(Date date, int amount) {
        return add(date, Calendar.MONTH, amount);
    }

    /**
     * 添加或减去天数
     *
     * @param date   Date对象
     * @param amount 增量用正数，否则用负数
     * @return date
     */
    public static Date addDay(Date date, int amount) {
        return add(date, Calendar.DATE, amount);
    }

    /**
     * 添加或减去小时
     *
     * @param date   Date对象
     * @param amount 增量用正数，否则用负数
     * @return date
     */
    public static Date addHour(Date date, int amount) {
        return add(date, Calendar.HOUR, amount);
    }

    /**
     * 添加或减去分钟
     *
     * @param date   Date对象
     * @param amount 增量用正数，否则用负数
     * @return date
     */
    public static Date addMinute(Date date, int amount) {
        return add(date, Calendar.MINUTE, amount);
    }

    /**
     * 添加或减去分钟
     *
     * @param date   Date对象
     * @param amount 增量用正数，否则用负数
     * @return date
     */
    public static Date addSecond(Date date, int amount) {
        return add(date, Calendar.SECOND, amount);
    }

    /**
     * xxxx年xx月xx日
     */
    public static String getTodayDate() {
        String format = "yyyy年MM月dd日";
        DateFormat df = new SimpleDateFormat(format);
        String s = df.format(new Date());
        return s;
    }

    public static String format(String time) {
        DateFormat df = new SimpleDateFormat(SaizConstant.DEF_DATETIME_FORMAT);
        String s = df.format(time);
        return s;

    }

    /**
     * 获取指定格式时间 用于命名或者时间处理
     */
    public static String getDateFormat(long time, String format) {
        String strTime = "";
        Timestamp a = new Timestamp(time);
        DateFormat df = new SimpleDateFormat(format);
        strTime = df.format(a);
        return strTime;

    }

    /**
     * 获取月份 true 当月 false 上月
     */
    public static String getMonth(boolean state) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        int month = 0;
        if (state) {
            month = calendar.get(Calendar.MONTH) + 1;
        } else {
            // 上个月
            calendar.add(Calendar.MONTH, -1);
            month = calendar.get(Calendar.MONTH) + 1;
        }
        return String.valueOf(month) + "月考勤";
    }

    public static String getWeekOfDate(Date date) {
        String[] weekDaysName = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int intWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        return weekDaysName[intWeek];
    }

    public static String getWeekOfString(String date) throws ParseException {
        String[] weekDaysName = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(sdf.parse(date));
        int intWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        return weekDaysName[intWeek];
    }

    public static int getDayOfDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int day = calendar.get(Calendar.DATE);
        return day;
    }

    public static int getDayOfString(String date) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(sdf.parse(date));
        int day = calendar.get(Calendar.DATE);
        return day;
    }

    public static int getMonthOfDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int month = calendar.get(Calendar.MONTH) + 1;
        return month;
    }

    public static int getMonthOfString(String date) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(sdf.parse(date));
        int month = calendar.get(Calendar.MONTH) + 1;
        return month;
    }
    public static int getYearOfString(String date) throws ParseException {
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    	  Calendar calendar = Calendar.getInstance();
          calendar.setTime(sdf.parse(date));
          int year = calendar.get(Calendar.YEAR);
          return year;
    }
}
